﻿using System;

namespace Oop.Shapes
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // Triangle t = new Triangle();
            // 里氏替换原则

            Shape t = new Triangle();
            t.边长 = new float[] { 3, 4, 5 };
            t.输出周长();
            t.输出面积();

            // Rectangle r = new Rectangle();
            Shape r = new Rectangle();
            r.边长 = new float[] { 4, 7, 4, 7 };
            r.输出周长();
            r.输出面积();
        }
    }

    public class Shape
    {
        public int 边的数量 { get; protected set; }

        public float[] 边长 { get; set; }

        public float 计算周长()
        {
            float sum = 0;
            for (int i = 0; i < 边的数量; i++)
            {
                sum += 边长[i];
            }
            return sum;
        }

        //virtual：虚函数：可以在子类里面被覆写，可在子类里重新规定行为
        public virtual float 计算面积() { return 0; }

        public void 输出周长()
        {
            Console.WriteLine("我有" + 边的数量 + "条边，周长是：" + 计算周长());
        }

        public void 输出面积()
        {
            Console.WriteLine("我有" + 边的数量 + "条边，面积是：" + 计算面积());
        }
    }

    //Triangle类 继承了 Shape类，Shape有的 Triangle都有
    public class Triangle : Shape
    {
        /// <summary>
        /// 构造函数，用类构造一个函数的时候会调用到
        /// </summary>
        public Triangle()       //访问修饰符 类名(参数列表)
        {
            边的数量 = 3;
        }

        //函数重写
        //特性三：多态
        public override float 计算面积()
        {
            float area = 0;
            float zcyb = 计算周长() / 2;
            area = (float)Math.Sqrt(zcyb * (zcyb - 边长[0]) * (zcyb - 边长[1]) * (zcyb - 边长[2]));
            return area;
        }
    }

    /// <summary>
    /// 长方形
    /// </summary>
    public class Rectangle : Shape
    {
        /// <summary>
        /// 构造函数，用类构造一个函数的时候会调用到
        /// </summary>
        public Rectangle()       //访问修饰符 类名(参数列表)
        {
            边的数量 = 4;
        }

        public override float 计算面积()
        {
            return 边长[0] * 边长[1];
        }
    }


}




//形状
// N条边 边长 计算周长 计算面积
//三角形
//四边形